


import bpy
import random

import 全局控制.Node.节点和插座基类.bl_节点基类 as 基类










class C_SN_安装物体材质(基类.C_SN_基类):
	bl_dname = 'bl_node_安装物体材质'
	bl_label = '安装物体材质'
	
	def init(self, context):
		super(C_SN_安装物体材质, self).f_init(context)
		self.inputs.new('C_NodeSocket_物体', name='物体')
		self.inputs.new('C_NodeSocket_材质集', name='材质')
		self.inputs.new('C_NodeSocket_i', name='槽索引')
		self.bl_icon = 'MATERIAL_DATA'

		#self.inputs['槽索引'].f_getData(-1)
		
	def draw_buttons(self, context, layout):
		#layout.prop(self, "m_参考物体")
		pass

	def f_update(self, 是否向下传递=False, input插座=None):
		物体集 = self.inputs['物体'].f_getData()
		材质集 = self.inputs['材质'].f_getData()

		槽索引 = self.inputs['槽索引'].f_getData()

		#处理物体数量和材质数量不同的情况
		是否独立材质 = False
		物体数量 = len(物体集)
		材质数量 = len(材质集)
		if 材质数量 > 1 :
			while 材质数量 != len(材质集) :
				if 材质数量 < 材质数量 :
					补充数量 = min(材质数量 - 材质数量, 材质数量)
					材质集.extend(random.sample(材质集, 补充数量))
					材质数量 = len(材质集)
				elif 材质数量 > 材质数量:
					材质集 = 材质集[:材质数量]
					break

			是否独立材质 = True

		index = 0
		for obj in 物体集:
			if len(obj.material_slots) > 槽索引 :
				obj.material_slots[槽索引].material = 材质集[index]
			else:
				obj.data.materials.append(材质集[index])
			if 是否独立材质 :
				index += 1

		super(C_SN_安装物体材质, self).f_update(是否向下传递, input插座)


class C_NODE_MENU_安装物体材质(bpy.types.Operator):
	bl_idname = 'node.global_node_set_install_material'
	bl_label = '安装物体材质'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		operator.use_transform = True
		bpy.ops.node.add_node(type='C_SN_安装物体材质', use_transform=True)
		return {'FINISHED'}
		










class C_SN_独立物体材质(基类.C_SN_基类):
	bl_dname = 'bl_node_独立物体材质'
	bl_label = '独立物体材质'
	
	def init(self, context):
		super(C_SN_独立物体材质, self).f_init(context)
		self.inputs.new('C_NodeSocket_物体', name='物体')
		self.inputs.new('C_NodeSocket_文本', name='材质名称')
		self.bl_icon = 'MATERIAL_DATA'
		
	def draw_buttons(self, context, layout):
		#layout.prop(self, "m_参考物体")
		pass

	def f_update(self, 是否向下传递=False, input插座=None):
		材质集 = self.inputs['物体'].f_getData()
		材质名称 = self.inputs['材质名称'].f_getData()
		
		super(C_SN_独立物体材质, self).f_update(是否向下传递, input插座)


class C_NODE_MENU_独立物体材质(bpy.types.Operator):
	bl_idname = 'node.global_node_set_material_texture_node'
	bl_label = '独立物体材质'
	bl_options = {'REGISTER', 'UNDO'}

	def execute(operator, context):
		operator.use_transform = True
		bpy.ops.node.add_node(type='C_SN_独立物体材质', use_transform=True)
		return {'FINISHED'}
		


classes = (
	C_SN_独立物体材质,
	C_NODE_MENU_独立物体材质,

	C_SN_安装物体材质,
	C_NODE_MENU_安装物体材质,


)

def register():
	for c in classes:
		bpy.utils.register_class(c)
		

def unregister():
	for c in classes:
		bpy.utils.unregister_class(c)





